/** 【文件说明】：日志记录类，用于方便地记录应用程序运行时的日志信息。
 *  【使用例子】：
 
    import { NumberUtils } from '@/utils/numberUtils';

    // 在某个方法或生命周期钩子中使用
    logger.debug('这是一条调试信息', { key: 'value' });
    logger.info('这是一条信息');
    logger.warn('这是一条警告信息', { warningCode: 404 });
    logger.error('发生了一个错误', error, { errorCode: 500 }); 
 */
class Logger {
    /**
     * 记录调试信息。
     * @param message - 要记录的调试信息。
     * @param data - 可选的数据对象，可以是任何 JSON 可序列化的类型。
     */
    public debug(message: string, data?: any): void {
      this.log('debug', message, data);
    }
  
    /**
     * 记录信息。
     * @param message - 要记录的信息。
     * @param data - 可选的数据对象，可以是任何 JSON 可序列化的类型。
     */
    public info(message: string, data?: any): void {
      this.log('info', message, data);
    }
  
    /**
     * 记录警告信息。
     * @param message - 要记录的警告信息。
     * @param data - 可选的数据对象，可以是任何 JSON 可序列化的类型。
     */
    public warn(message: string, data?: any): void {
      this.log('warn', message, data);
    }
  
    /**
     * 记录错误信息。
     * @param message - 要记录的错误信息。
     * @param error - 可选的错误对象。
     * @param data - 可选的数据对象，可以是任何 JSON 可序列化的类型。
     */
    public error(message: string, error?: Error, data?: any): void {
      const logData = { ...data, error: error ? error.message : undefined };
      this.log('error', message, logData);
    }
  
    /**
     * 内部方法，用于实际的日志记录。
     * @param level - 日志级别（debug, info, warn, error）。
     * @param message - 要记录的消息。
     * @param data - 可选的数据对象，可以是任何 JSON 可序列化的类型。
     */
    private log(level: 'debug' | 'info' | 'warn' | 'error', message: string, data?: any): void {
      const timestamp = new Date().toISOString();
      const logMessage = `[${timestamp}] [${level.toUpperCase()}] ${message}`;
      const logData = data ? JSON.stringify(data) : '';
  
      // 根据环境选择不同的输出方式
      if (process.env.NODE_ENV === 'production') {
        // 在生产环境中，可以将日志发送到服务器或第三方日志服务
        // 例如，使用 fetch 或 axios 发送日志到后端 API
        this.sendLogToServer(logMessage, logData);
      } else {
        // 在开发环境中，直接输出到控制台
        console[level](logMessage, logData);
      }
    }
  
    /**
     * 将日志发送到服务器（示例方法，需要根据实际情况实现）。
     * @param logMessage - 日志消息。
     * @param logData - 日志数据。
     */
    private sendLogToServer(logMessage: string, logData: string): void {
      // 这里可以使用 fetch 或 axios 等库将日志发送到后端 API
      // 例如：
      // fetch('/api/logs', {
      //   method: 'POST',
      //   headers: {
      //     'Content-Type': 'application/json'
      //   },
      //   body: JSON.stringify({ message: logMessage, data: logData })
      // });
      console.log(`[SEND TO SERVER] ${logMessage} ${logData}`);
    }
  }
  
  // 导出单例实例
  const logger = new Logger();
  export default logger;